﻿/**
 * \file VueUnites.cs
 * \author Nicolas VAILLIET
 * \author Aurelien MADIOT
 * \date 2 janvier 2013
 * \version 1.0
 * \brief Affichage console des tours de jeu des unites
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using InterfaceJeu;

namespace VueConsole
{
    /**
* \class VueUnites
* \brief Affichage console des tours de jeu des unités
*/
    class VueUnites
    {

        /**
         * \fn public static void menuUnite(Unite unit)
         * \param unit l'unité qui effectuera l'action
         * \brief Affiche la menu d'actions d'une unité
         * */
        public static void menuUnite(Unite unit)
        {
            if (unit is Enseignant)
            {
                Jeu monjeu = ImplementationJeu.Jeu.Instance;
                PlacePourVilles ppv = new PlacePourVilles(monjeu.sonTour, unit.position.getIndex(), unit.nbMouvement, monjeu.Carte.fabriqueCase.carteBrute, monjeu.Carte.TailleCote);
                ppv.run();
                vector_int suggest = ppv.get_result();

                Coordonnees c1 = new ImplementationJeu.Coordonnees(suggest[0]);
                Coordonnees c2 = new ImplementationJeu.Coordonnees(suggest[1]);
                Coordonnees c3 = new ImplementationJeu.Coordonnees(suggest[2]);

                Console.Write("Proposition de case pour créer une ville : \n");
                Console.Write("Proposition 1 : (" + c1.abscisse + ":" + c1.ordonnee + ")\n");
                Console.Write("Proposition 2 : (" + c2.abscisse + ":" + c2.ordonnee + ")\n");
                Console.Write("Proposition 3 : (" + c3.abscisse + ":" + c3.ordonnee + ")\n");
            }

            Console.Write("Actions : Déplacer (d), Speciales (s), Fin  du tour (f) : ");
            int c = Console.Read();
            while (c != 'd' && c != 's' && c != 'f')
                c = Console.Read();
            if (c == 'd')
            {
                menuDeplacer(unit);
                menuUnite(unit);
            }
            else if (c == 's')
            {
                menuSpeciales(unit);
                menuUnite(unit);
            }
        }

        /**
         * \fn private static void menuDeplacer(Unite unit)
         * \param unit l'unité qui effectuera l'action
         * \brief Affiche la menu du déplacement d'une unité
         * */
        private static void menuDeplacer(Unite unit)
        {
            Console.Write("Deplacer vers :\n");
            Console.WriteLine("Abscisse :");
            int abs = 0;
            while (true)
            {
                try
                {
                    abs = (int.Parse(Console.ReadLine()));
                    break;
                }
                catch (Exception) { }
            }

            Console.WriteLine("Ordonnee :");
            int ord = 0;
            while (true)
            {
                try
                {
                    ord = (int.Parse(Console.ReadLine()));
                    break;
                }
                catch (Exception) { }
            }
            //Console.Write(abs + ":" + ord + "\n");

            unit.seDeplacer(ImplementationJeu.Jeu.Instance.Carte.obtenirCase(new ImplementationJeu.Coordonnees(abs, ord)));
        }

        /**
         * \fn private static void menuSpeciales(Unite unit)
         * \param unit l'unité qui effectuera l'action
         * \brief Affiche la menu des actions spéciales d'une unité
         * */
        private static void menuSpeciales(Unite unit)
        {
            if (unit is Directeur)
            {
                Console.Write("Pas d'actions spéciales\n");
            }
            else if (unit is Etudiant)
            {
                Console.Write("Action spéciale combattre la case :\n");
                Console.WriteLine("Abscisse :");
                int abs = 0;
                while (true)
                {
                    try
                    {
                        abs = (int.Parse(Console.ReadLine()));
                        break;
                    }
                    catch (Exception) { }
                }
                Console.WriteLine("Ordonnee :");
                int ord = 0;
                while (true)
                {
                    try
                    {
                        ord = (int.Parse(Console.ReadLine()));
                        break;
                    }
                    catch (Exception) { }
                }

                //Console.Write(abs + ":" + ord + "\n");
                ((Etudiant)unit).combattre(ImplementationJeu.Jeu.Instance.Carte.obtenirCase(new ImplementationJeu.Coordonnees(abs, ord)));

            }
            else if (unit is Enseignant)
            {
                Console.Write("Action spéciale creerVille\n");
                ((Enseignant)unit).creerVille();
            }

        }

        /**
         * \fn public static void printUniteProperties(Unite unit)
         * \param unit l'unité dont on veut afficher les infos
         * \brief Imprime les informations d'une unité
         */
        public static void printUniteProperties(Unite unit)
        {
            Console.Clear();
            Console.Write("\n\n----------------------------\n");
            Console.Write("Info sur " + unit.GetType().ToString().Substring(18) + " en " + unit.position.abscisse + ":" + unit.position.ordonnee + "\n");
            Console.Write("Attaque : " + unit.pointAttaque + "\n");
            Console.Write("Defense : " + unit.pointDefense + "\n");
            Console.Write("Mouvement : " + unit.nbMouvement + "\n");
            Console.Write("Vies : " + unit.pointDeVie + "\n");
            Console.Write("\n\n----------------------------\n");
        }
    }
}
